package com.campus.help.controller.admin;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.campus.help.common.PageResult;
import com.campus.help.common.Result;
import com.campus.help.entity.LaborType;
import com.campus.help.service.LaborTypeService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 劳务类型管理控制器
 */
@Slf4j
@RestController
@RequestMapping("/admin/labor-types")
public class AdminLaborTypeController {

    @Autowired
    private LaborTypeService laborTypeService;

    /**
     * 测试接口
     * @return 测试结果
     */
    @GetMapping("/test")
    public Result<String> test() {
        return Result.success("劳务类型管理接口正常工作");
    }

    /**
     * 分页查询劳务类型列表
     * @param page 页码
     * @param size 每页大小
     * @param keyword 关键词
     * @param status 状态
     * @return 分页结果
     */
    @GetMapping
    public Result<PageResult<LaborType>> getLaborTypePage(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "20") Integer size,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) Integer status) {
        
        try {
            log.info("查询劳务类型列表，页码：{}，每页大小：{}，关键词：{}，状态：{}", page, size, keyword, status);
            
            IPage<LaborType> result = laborTypeService.getLaborTypePage(page, size, keyword, status);
            
            PageResult<LaborType> pageResult = new PageResult<LaborType>(
                result.getCurrent(),
                result.getSize(),
                result.getTotal(),
                result.getRecords()
            );
            
            return Result.success(pageResult);
        } catch (Exception e) {
            log.error("查询劳务类型列表失败", e);
            return Result.error("查询失败");
        }
    }

    /**
     * 根据ID查询劳务类型详情
     * @param id 劳务类型ID
     * @return 劳务类型详情
     */
    @GetMapping("/{id}")
    public Result<LaborType> getLaborTypeById(@PathVariable Long id) {
        try {
            log.info("查询劳务类型详情，ID：{}", id);
            
            LaborType laborType = laborTypeService.getById(id);
            if (laborType == null) {
                return Result.error("劳务类型不存在");
            }
            
            return Result.success(laborType);
        } catch (Exception e) {
            log.error("查询劳务类型详情失败，ID：{}", id, e);
            return Result.error("查询失败");
        }
    }

    /**
     * 添加劳务类型
     * @param laborType 劳务类型信息
     * @return 操作结果
     */
    @PostMapping
    public Result<String> addLaborType(@RequestBody LaborType laborType) {
        try {
            log.info("添加劳务类型，类型名称：{}", laborType.getTypeName());
            
            // 参数校验
            if (laborType.getTypeName() == null || laborType.getTypeName().trim().isEmpty()) {
                return Result.error("类型名称不能为空");
            }
            
            if (laborType.getDescription() == null || laborType.getDescription().trim().isEmpty()) {
                return Result.error("类型描述不能为空");
            }
            
            laborTypeService.createLaborType(laborType);
            return Result.success("添加成功");
        } catch (Exception e) {
            log.error("添加劳务类型失败", e);
            return Result.error("添加失败");
        }
    }

    /**
     * 更新劳务类型
     * @param id 劳务类型ID
     * @param laborType 劳务类型信息
     * @return 操作结果
     */
    @PutMapping("/{id}")
    public Result<String> updateLaborType(@PathVariable Long id, @RequestBody LaborType laborType) {
        try {
            log.info("更新劳务类型，ID：{}，类型名称：{}", id, laborType.getTypeName());
            
            // 参数校验
            if (laborType.getTypeName() == null || laborType.getTypeName().trim().isEmpty()) {
                return Result.error("类型名称不能为空");
            }
            
            if (laborType.getDescription() == null || laborType.getDescription().trim().isEmpty()) {
                return Result.error("类型描述不能为空");
            }
            
            laborType.setId(id);
            laborTypeService.updateLaborType(laborType);
            return Result.success("更新成功");
        } catch (Exception e) {
            log.error("更新劳务类型失败，ID：{}", id, e);
            return Result.error("更新失败");
        }
    }

    /**
     * 删除劳务类型
     * @param id 劳务类型ID
     * @return 操作结果
     */
    @DeleteMapping("/{id}")
    public Result<String> deleteLaborType(@PathVariable Long id) {
        try {
            log.info("删除劳务类型，ID：{}", id);
            
            // 检查是否存在
            LaborType laborType = laborTypeService.getById(id);
            if (laborType == null) {
                return Result.error("劳务类型不存在");
            }
            
            boolean success = laborTypeService.deleteLaborType(id);
            if (success) {
                return Result.success("删除成功");
            } else {
                return Result.error("删除失败");
            }
        } catch (Exception e) {
            log.error("删除劳务类型失败，ID：{}", id, e);
            return Result.error("删除失败");
        }
    }

    /**
     * 切换劳务类型状态
     * @param id 劳务类型ID
     * @param requestBody 请求体，包含status字段
     * @return 操作结果
     */
    @PutMapping("/{id}/status")
    public Result<String> toggleStatus(@PathVariable Long id, @RequestBody java.util.Map<String, Integer> requestBody) {
        try {
            Integer status = requestBody.get("status");
            log.info("切换劳务类型状态，ID：{}，状态：{}", id, status);
            
            // 检查是否存在
            LaborType laborType = laborTypeService.getById(id);
            if (laborType == null) {
                return Result.error("劳务类型不存在");
            }
            
            // 状态校验
            if (status == null || (status != 0 && status != 1)) {
                return Result.error("状态值无效");
            }
            
            boolean success = laborTypeService.updateStatus(id, status);
            if (success) {
                String statusText = status == 1 ? "启用" : "禁用";
                return Result.success(statusText + "成功");
            } else {
                return Result.error("操作失败");
            }
        } catch (Exception e) {
            log.error("切换劳务类型状态失败，ID：{}", id, e);
            return Result.error("操作失败");
        }
    }
}
